import pandas as pd
import re

# 读取Excel文件
df = pd.read_excel('student.xlsx')

# 确保必要的列存在
required_columns = ['性别', '年龄', '家庭地址']
for col in required_columns:
    if col not in df.columns:
        raise ValueError(f"Excel文件中缺少必要的列：{col}")

# 1. 统计性别人数
gender_count = df['性别'].value_counts()

# 2. 按年龄段统计（18岁以下、18-20岁、21-23岁、24岁及以上）
def get_age_group(age):
    try:
        age = int(age)
        if age < 18:
            return '18岁以下'
        elif 18 <= age <= 20:
            return '18-20岁'
        elif 21 <= age <= 23:
            return '21-23岁'
        else:
            return '24岁及以上'
    except:
        return '年龄未知'

df['年龄段'] = df['年龄'].apply(get_age_group)
age_group_count = df['年龄段'].value_counts().reindex(
    ['18岁以下', '18-20岁', '21-23岁', '24岁及以上', '年龄未知'], 
    fill_value=0
)

# 3. 按地区统计（从家庭地址提取省份）
def extract_province(address):
    if not address or pd.isna(address):
        return '地址未知'
    
    # 常见省份/直辖市列表
    provinces = ['北京市', '上海市', '天津市', '重庆市', 
                 '河北省', '山西省', '辽宁省', '吉林省', '黑龙江省',
                 '江苏省', '浙江省', '安徽省', '福建省', '江西省', '山东省',
                 '河南省', '湖北省', '湖南省', '广东省', '海南省', '四川省',
                 '贵州省', '云南省', '陕西省', '甘肃省', '青海省', '台湾省',
                 '内蒙古自治区', '广西壮族自治区', '宁夏回族自治区', 
                 '新疆维吾尔自治区', '西藏自治区', '香港特别行政区', '澳门特别行政区']
    
    for province in provinces:
        if address.startswith(province):
            return province
    
    # 处理省略"省/市"的情况
    short_provinces = {
        '北京': '北京市', '上海': '上海市', '天津': '天津市', '重庆': '重庆市',
        '河北': '河北省', '山西': '山西省', '辽宁': '辽宁省', '吉林': '吉林省',
        '黑龙江': '黑龙江省', '江苏': '江苏省', '浙江': '浙江省', '安徽': '安徽省',
        '福建': '福建省', '江西': '江西省', '山东': '山东省', '河南': '河南省',
        '湖北': '湖北省', '湖南': '湖南省', '广东': '广东省', '海南': '海南省',
        '四川': '四川省', '贵州': '贵州省', '云南': '云南省', '陕西': '陕西省',
        '甘肃': '甘肃省', '青海': '青海省', '台湾': '台湾省'
    }
    
    for short, full in short_provinces.items():
        if address.startswith(short):
            return full
    
    return '其他地区'

df['省份'] = df['家庭地址'].apply(extract_province)
province_count = df['省份'].value_counts()

# 计算总人数
total = len(df)

# 打印统计结果
print("=" * 60)
print("学生信息综合统计结果")
print("=" * 60)

# 性别统计
print("\n【性别统计】")
print("-" * 40)
print(f"男生人数：{gender_count.get('男', 0)} 人，占比：{gender_count.get('男', 0)/total*100:.2f}%")
print(f"女生人数：{gender_count.get('女', 0)} 人，占比：{gender_count.get('女', 0)/total*100:.2f}%")

# 年龄段统计
print("\n【年龄段统计】")
print("-" * 40)
for group, count in age_group_count.items():
    print(f"{group}：{count} 人，占比：{count/total*100:.2f}%")

# 地区统计
print("\n【地区分布统计】")
print("-" * 40)
for province, count in province_count.items():
    print(f"{province}：{count} 人，占比：{count/total*100:.2f}%")

print("\n" + "=" * 60)
print(f"总人数：{total} 人")
print("=" * 60)
    
